#pragma once

#include "Poller.h"
#include "Timestamp.h"

#include <vector>
#include <sys/epoll.h>

class Channel;

/**
 * epoll的使用  
 * epoll_create
 * epoll_ctl   add/mod/del
 * epoll_wait
 */ 
// EPollPoller 使用了 Linux 下的 epoll 机制来实现高效的事件轮询。
class EPollPoller : public Poller
{
public:
    EPollPoller(EventLoop *loop);
    ~EPollPoller() override;

    // 重写基类Poller的虚函数，执行具体的事件轮询逻辑
    // timeoutMs 是超时时间，单位为毫秒
    // activeChannels 是活跃事件列表的输出参数
    Timestamp poll(int timeoutMs, ChannelList *activeChannels) override;
    void updateChannel(Channel *channel) override;
    void removeChannel(Channel *channel) override;
private:
    // 初始事件列表大小
    static const int kInitEventListSize = 16;

    // 根据 epoll 返回的事件数量填充活跃事件列表
    void fillActiveChannels(int numEvents, ChannelList *activeChannels) const;
    // 更新 epoll 监控的事件，operation 为 EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL
    void update(int operation, Channel *channel);

     // 用于存放 epoll_event 结构体的 vector
    using EventList = std::vector<struct epoll_event>;   // epoll_wait的第二个参数, 传出数组; 

    int epollfd_;
    EventList events_;
};
